<?php
session_start();
header("Content-type: text/html; charset=utf-8");
class crontab extends spController
{
    function __construct(){
        parent::__construct();        
        $this->ac = $GLOBALS['_GET']['a'];
        $this->con = $GLOBALS['_GET']['c']; 
    }
  	/**
    * 同步虚拟历史
    */
  	function sync_sim_history(){
        $http = spClass("HttpSendData");
        $history_model = spClass("zd_alertnatehistory");
        $result = $http->sendGet("https://historygen.com/index.php/apihistory/getNewestHistory");
        if(!empty($result)){
            $result = json_decode($result,true);
            if($result['status'] == 0){
                $history = $result['data'];                
                foreach($history as $v){                    
                    $fand = $history_model->find(array("sim_event_id"=>$v['sim_event_id']));
                    if(empty($fand)){
                        $history_model->create(array(
                            "assumption"=>$v["assumption"],
                            "simulate_desc"=>$v["simulated_description"],
                            "timeline"=>$v["timeline"],
                            "sim_event_id"=>$v["sim_event_id"],
                            "imgslist"=>empty($v["imgs"])?"":$v["imgs"],
                            "user_altermate"=>$v["user_alternate"]
                        ));
                    }
                }
            }
        }
    }
  //===============================文心一言=================
    /**
     * 使用 AK，SK 生成鉴权签名（Access Token）
     * @return string 鉴权签名信息（Access Token）
     */
    function getYyAccessToken(){
        $curl = curl_init();
        $postData = array(
            'grant_type' => 'client_credentials',
            'client_id' => 'WAnriBPwo1XfmqDXw8FBv6iq',
            'client_secret' => 'aV5Q0hmCpIZsVhm44kZrGult8ylL89zw'
        );
        curl_setopt_array($curl, array(
            CURLOPT_URL => 'https://aip.baidubce.com/oauth/2.0/token',
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POSTFIELDS => http_build_query($postData)
        ));
        $response = curl_exec($curl);
        curl_close($curl);
        $rtn = json_decode($response);
        return $rtn->access_token;
    }
    /**
     * 文心一言发送指令
     **/
    function sendYyPrompt($messages) {
        //print_r($messages);
        $token = $this->getYyAccessToken();
        //print_r($token);
        $curl = curl_init();
        // 默认使用4.0
        $url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/ernie-3.5-8k-preview?access_token=".$token; 
        curl_setopt_array($curl, array(
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER  => false,
            CURLOPT_SSL_VERIFYHOST  => false,
            CURLOPT_CUSTOMREQUEST => 'POST',
            
            CURLOPT_POSTFIELDS =>$messages,
    
            CURLOPT_HTTPHEADER => array(
                'Content-Type: application/json'
            ),

        ));
        $response = curl_exec($curl);
        curl_close($curl);
        //print_r("生成结果:".$response);
        return $response;
    }
    //========================================================
  function sendGptNew($messages){
    	$http = spClass("HttpSendData");
        $stream = false;
        $send = array(
            "messages"=>json_decode($messages,true),
            "temperature"=>0.7,
            "top_p"=>1,
            "stream"=>$stream,
            "stop"=>"",
            "presence_penalty"=>0,
            "frequency_penalty"=>0,
            "max_tokens"=>4000
            );
            
        
        $header = array(
            "Content-Type: application/json",
            "api-key: 0c22cdbb37e3490481a4806ac91c45cd"
        );
        // print_r($header);exit();
        $res = $http->http_post_data("https://renbenaigpt4.openai.azure.com/openai/deployments/gpt-4-1106/chat/completions?api-version=2023-07-01-preview",json_encode($send),$header);
        return $res;
    }
    function splitArticleByParagraphs($article){
        // 使用正则表达式分割文章，\n表示换行符，匹配一个或多个连续的换行符
        preg_match_all('/\n+/', $article, $matches);
        // 获取匹配的换行符位置
        $paragraphBreaks = array_keys($matches[0]);
        
        // 初始化空数组用于存储分段后的文章
        $paragraphs = [];
        
        // 遍历匹配的换行符位置，创建段落
        for ($i = 0, $len = count($paragraphBreaks); $i < $len; $i++) {
            // 获取当前段落的开始和结束位置
            $start = $i === 0 ? 0 : $paragraphBreaks[$i - 1] + 1;
            $end = $i < $len - 1 ? $paragraphBreaks[$i] : strlen($article);
            
            // 添加当前段落到结果数组
            $paragraphs[]["txt"] = trim(substr($article, $start, $end - $start));
        }
        
        return $paragraphs;
    }
  /**
    * 古诗生成故事
    */
    function createGushiStory(){
        $zd_story_info = spClass("zd_story_info");
        $zd_story = spClass("zd_story");
        $zd_gushi = spClass("zd_gushi");
        
        // 查询待转换的古诗，每次处理10条
        $poetry_list = $zd_gushi->findAll(array("hasstory"=>2),"id asc",0,10);
        foreach($poetry_list as $v){
            $_content = $v['content'];
            $prompt = "你的任务： 根据输入的古诗生成一个生动有趣的小说。 规则要求： 1、理解诗意：首先，深入理解古诗的内容和背景，包括诗人的生平、社会环境、历史背景等，这对于后续的故事构思至关重要。 确定故事主题：根据古诗的主旨，确定故事的主题。例如，一首描写离别的古诗，故事可以围绕爱情、友情或战乱中的生离死别展开。 2、构建情节：围绕主题构建故事的情节，可以包括背景设定、冲突、高潮和结局等。这些情节需要与古诗的意境相吻合。 3、塑造角色：根据古诗中的人物或意象，塑造故事的角色。角色应有鲜明的个性，他们的行为和对话应体现出古诗的意境。 4、描绘环境：古诗中常常有对自然景观的描绘，将这些元素融入故事的背景中，增强故事的艺术感和氛围。 5、情感深化：古诗往往表达了一种或多种强烈的情感，如忧愁、喜悦、孤独、激昂等。在故事中，通过角色的内心独白、行为表现和情节发展，深化这些情感。 6、文化元素：加入中国传统文化元素，如服饰、建筑、节日、礼仪等，让故事更具有历史感和文化底蕴。 7、语言风格：故事的叙述语言可以借鉴古诗的风格，如使用对仗、排比、夸张等修辞手法，使故事的语言具有一定的诗意。 8、创新与想象：在尊重原诗的基础上，发挥想象，创造性地添加新的情节和角色，使故事内容更加丰富和完整。 9、符合时代精神：在故事中融入社会主义核心价值观，展现积极向上的时代精神，让故事既有古典韵味，又符合现代审美和价值观。 10、小说总字数不少于1000字，小说要以第一人称描写。 11、角色对话丰富，人物性格鲜明，结尾不要做总结，要给读者无限的想象空间。 输入内容： ".$_content;
          
          $result = $this->sendGptNew(json_encode(
          	array(
                  	array(
                        "role"=>"system",
                        "content"=>"你是专业的小说作家，你擅长写小说"
                    ),
                    array(
                        "role"=>"user",
                        "content"=>$prompt
                    )
                )
          ));
            
            if(!empty($result)){
                $result = json_decode($result,true);
                if(!empty($result['choices'][0]['message']['content'])){
                    $story_content = $result['choices'][0]['message']['content'];
                    $tags = "";
                    $title = "";
                    // 第一步、为故事生成标题
                    $prompt_title = "你的任务：请为输出入的文章生成一个吸引人的标题，标题要足够吸引人眼球，总字数不超过30字。输出的文章：".$story_content;
                    $result_title = $this->sendGptNew(json_encode(
                    	array(
                            array(
                                "role"=>"user",
                                "content"=>$prompt_title
                            )
                        )
                    ));
                    if(!empty($result_title)){
                        $result_title_json = json_decode($result_title,true);
                        if(!empty($result_title_json['choices'][0]['message']['content'])){
                            // 标题生成成功
                            $title = $result_title_json['choices'][0]['message']['content'];
                        }
                    }
                    // 第二步、为故事提取标签
                    $prompt_tags = "你的任务：请为输出入的文章提取10-30个标签。要求：1、标签要能表达文章的核心意思。2、只返回输出模版要求的格式内容，不要返回其他任何无关文本。3、输出模版：{\"result\":\"标签1,标签2,标签3,标签4...\"}输出的文章：".$story_content;
                    $result_tags = $this->sendGptNew(json_encode(
                    	array(
                            array(
                                "role"=>"user",
                                "content"=>$prompt_tags
                            )
                        )
                    ));
                    if(!empty($result_tags)){
                        $result_tags_json = json_decode($result_tags,true);
                        if(!empty($result_tags_json['choices'][0]['message']['content'])){
                            // 标签生成成功
                            $tags_arr = json_decode($result_tags_json['choices'][0]['message']['content'],true);
                            $tags = $tags_arr['result'];
                        }
                    }
                  print_r($title);
                    print_r("<br>");
                    print_r($story_content);
                    print_r("<br>");
                    print_r($tags);
                    print_r("<br>");
                    print_r($_content);
                    print_r("<br>");
                    if(!empty($title) && !empty($story_content)){
                        $addid_story = $zd_story->create(
                            array(
                                "prompt"=>$title,
                                "type"=>1,
                                "likes"=>0,
                                "favors"=>0,
                                "styleId"=>1,
                                "lingo"=>"zh",
                                "is_en"=>0,
                                "is_qa"=>0,
                                "is_public"=>1,
                                "is_read"=>0,
                                "status"=>2,
                                "gsid"=>$v["id"],
                                "ctime"=>time(),
                                "etime"=>time()
                            )
                        );
                        if($addid_story>0){
                            $content_arr = $this->splitArticleByParagraphs($story_content);
                            $addid_story_content = $zd_story_info->create(
                                array(
                                    "storyId"=>$addid_story,
                                    "type"=>1,
                                    "title"=>$title,
                                    "content"=>$story_content,
                                    "tags"=>$tags,
                                    "content_arr"=>$content_arr,
                                    "is_check"=>1,
                                    "finished"=>1,                                    
                                    "ctime"=>time(),
                                    "etime"=>time()
                                )
                            );
                            $zd_gushi->update(array("id"=>$v["id"]),array("hasstory"=>1));
                          
                        }
                    }
                }
            }
            sleep(1);
        }
    }
}